#include <iostream>
#include <ctime>
using namespace std;

struct tLE {
    tLE *next;
    int data;
};


void StackMassInc(int n, tLE*(&head)){
    int i = n;
    tLE* p;
    p = NULL;
    do{
        head = new tLE;
        head->next = p;
        p = head;
        head->data = i;
        i--;
    }while(i > 0);
}

void QueueMassInc(int n, tLE* &head) {
    tLE* p = head;
    for (int i = 1; i < n; i++){
        p->data = i;
        p->next = new tLE;
        p = p->next;
    }
    p->data = n;
    p->next = NULL;
}


void StackMassDec(int n, tLE*(&head)){
    int i = 1;
    tLE* p;
    p = NULL;
    do{
        head = new tLE;
        head->next = p;
        p = head;
        head->data = i;
        i++;
    }while (i <= n);
}

void QueueMassDec(int n, tLE* &head) {
    tLE* p = head;
    for (int i = n; i > 1; i--){
        p->data = i;
        p->next = new tLE;
        p = p->next;
    }
    p->data = 1;
    p->next = NULL;
}


void StackMassRand(int n, tLE*(&head)){
    srand(time(NULL));
    int i = 1;
    tLE* p;
    p = NULL;
    do{
        head = new tLE;
        head->next = p;
        p = head;
        head->data = rand() % (n * 2);
        i++;
    }while (i <= n);
}

void QueueMassRand(int n, tLE* &head) {
    tLE* p = head;
    for (int i = 1; i < n; i++){
        p->data = rand() % (n * 2);
        p->next = new tLE;
        p = p->next;
    }
    p->data = rand() % (n * 2);
    p->next = NULL;
}


void PrintList(tLE *p){
    while (p != NULL){
        cout << p->data << " ";
        p = p -> next;
    }
    cout << endl;
}


void SummaList(tLE *p){
    int summa = 0;
    while (p != NULL){
        summa += p->data;
        p = p -> next;
    }
    cout << "Сумма = " << summa << endl;
}


void RunNumberList(tLE *p, int n){
    int r = 1, temp;
    for(int i = 0; i < n - 1; i++){
        temp = p->data;
        p = p->next;
        if(temp > p->data){
            r++;
        }
    }
    cout << "Серий = " << r << endl;
}


int main(){
    int n;
    tLE *head = NULL, *tail = NULL;
    cout << "Введите количество элементов: ";
    cin >> n;
    
    cout << "\nСтек с возрастающими числами: \n";
    StackMassInc(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);

    cout << "\nСтек с убывающими числами: \n";
    StackMassDec(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);

    cout << "\nСтек с рандомными числами: \n";
    StackMassRand(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);
    
    cout << "\nОчередь с возрастающими числами: \n";
    QueueMassInc(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);
    
    cout << "\nОчередь с убывающими числами: \n";
    QueueMassDec(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);
    
    cout << "\nОчередь с рандомными числами: \n";
    QueueMassRand(n, head);
    PrintList(head);
    SummaList(head);
    RunNumberList(head, n);
    
    return 0;
}
